home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / allocaap.zip / ALLOCA.H < prev    next >
C/C++ Source or Header  |  1990-08-29  |  2KB  |  70 lines

  1. /* alloca for Turbo C
  2. * public domain with the restriction that the following line is always retained:
  3. * ... alloca() written by Alexander Pruss ...
  4. * Options:
  5. ** INLINE_ALLOCA -- sets up an inline equivalent to the assembly version.
  6. **                  equivalent in all respects but it is macro.
  7. ** FORCE_STACK   -- forces a stack frame for each function.  This will increase
  8. **                  the stack frame for each function that already has a frame
  9. **                  and calls alloca() by 2 bytes.  If it is activated, the
  10. **                  alloca call MUST be of the form:  xxx=yyy alloca(zzz);
  11. **                  where yyy and xxx are anything valid.
  12. */
  13.  
  14. #ifndef alloca
  15.  
  16. #ifndef __TURBOC__
  17. #error Turbo C is required for alloca.h.  Sorry.
  18. #endif
  19.  
  20. #ifdef INLINE_ALLOCA
  21. void __emit__();
  22.  
  23. #define MAKE_FAR_PTR(seg,off) \
  24.  (void far *) ( ( (unsigned long)(seg) << 16 ) | ( (unsigned int)(off) ) )
  25.  
  26. #define MAKE_EVEN(x)   ( ( ((x)+1)>>1 ) <<1 )
  27.  
  28. #if sizeof(void *)==4
  29. #define _alloca(space) (void *) \
  30.      ( __emit__(0x07, 0x5B, 0x59, 0x51, 0x53, 0x06), \
  31.     _SP-=MAKE_EVEN((space)), __emit__(0x51,0x53,0x06), MAKE_FAR_PTR(_SS,_SP+8))
  32. #else
  33. #define _alloca(space) (void *) \
  34.          ( __emit__(0x5B, 0x59, 0x51, 0x53), \
  35.     _SP-=MAKE_EVEN((space)), __emit__(0x51,0x53), MAKE_FAR_PTR(_SS,_SP+6))
  36. #endif
  37.  
  38. /* this is equivalent in operation to the assembly language version.
  39. The emits are: es bx cx
  40.    pop es  (only if large data)
  41.    pop bx
  42.    pop cx
  43.    push cx
  44.    push bx
  45.    push es   (to save the (DS,SI,DI), or (SI,DI) in small data)
  46.   followed by
  47.    push cx
  48.    push bx
  49.    push es   (to make a copy of (DS,SI,DI))
  50. */
  51. #else
  52.  
  53. void *_alloca(unsigned length);
  54.  
  55. #endif  /* INLINE */
  56.  
  57. #ifdef FORCE_STACK
  58. # if __TURBOC__ > 0x200
  59.   static long __global_long_dummy__;
  60. # define alloca(x) _alloca((x)); { long z; __global_long_dummy__=z; };
  61. #else
  62. # define alloca(x) _alloca((x)); { char z; z=z; };
  63. #endif
  64.  
  65. #else
  66. #define alloca(x) _alloca((x))
  67. #endif
  68.  
  69. #endif /* def alloca */
  70.